package br.com.equus.bean;

import java.util.ArrayList;
import java.util.Date;
import java.util.List;

import javax.annotation.PostConstruct;
import javax.faces.bean.ManagedBean;
import javax.faces.bean.ManagedProperty;
import javax.faces.bean.ViewScoped;
import javax.sql.rowset.serial.SerialBlob;

import org.primefaces.event.FileUploadEvent;
import org.primefaces.model.UploadedFile;

import br.com.arquitetura.bean.BaseBean;
import br.com.arquitetura.excecao.ExcecaoUtil;
import br.com.arquitetura.util.ConstantesARQ;
import br.com.arquitetura.util.FacesMessagesUtil;
import br.com.equus.entidade.Animal;
import br.com.equus.entidade.ImagemAnimal;
import br.com.equus.service.AnimalService;
import br.com.equus.util.ImagemUtil;

@ManagedBean(name = "imagemAnimalBean")
@ViewScoped
public class ImagemAnimalBean extends BaseBean<Animal> {

	private static final long serialVersionUID = 1L;

	private List<ImagemAnimal> imagensToList;

	private ImagemAnimal imagemExcluir;

	@ManagedProperty(value = "#{animalService}")
	private AnimalService animalService;

	public ImagemAnimalBean() {
		imagensToList = new ArrayList<ImagemAnimal>();

	}

	@Override
	public void verificarAcesso() {
		acessoBean.bloquearTela("ROLE_FOTO");

	}

	@PostConstruct
	public void carregarListas() {
		try {
			Integer idAnimal = (Integer) getSessionMap().remove("idAnimal");
			if (idAnimal != null) {
				setModel((Animal) universalManager.get(Animal.class, idAnimal));
				load();
			}

		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	@Override
	public String load() {
		try {
			super.load();
			if (getModel().getImagens() != null && !getModel().getImagens().isEmpty()) {
				imagensToList = new ArrayList<ImagemAnimal>(getModel().getImagens());
			}
		} catch (Exception e) {
			ExcecaoUtil.tratarExcecao(e);
		}
		return SUCCESS;
	}

	public void deleteImagem() {
		try {
			if (imagemExcluir != null && imagemExcluir.getId() != null) {
				universalManager.remove(ImagemAnimal.class, imagemExcluir.getId());
				getModel().getImagens().remove(imagemExcluir);

			}
			getImagensToList().remove(imagemExcluir);
			getModel().getListaUrls();

			FacesMessagesUtil.addInfoMessage("Imagem ", "Removida" + " " + ConstantesARQ.COM_SUCESSO);
		} catch (Exception e) {
			FacesMessagesUtil.addErrorMessage(this.getQualifiedName(), ConstantesARQ.ERRO_EXCLUIR);
			ExcecaoUtil.tratarExcecao(e);
		}

	}

	public void handleFileUpload(FileUploadEvent event) {
		ImagemAnimal imagem = new ImagemAnimal();
		UploadedFile f = event.getFile();

		try {
			String name = ImagemUtil.trataNomeArquivo(event.getFile().getFileName());
			String nomeAnimal = ImagemUtil.trataNomeArquivo(getModel().getNome().trim());

			imagem.setImagem(new SerialBlob(event.getFile().getContents()));
			imagem.setNomeImagem(nomeAnimal + "_" + getModel().getId() + "_" + name);
			imagem.setTipoImagem(event.getFile().getContentType());
			imagem.setAnimal(getModel());
			imagem.setDtCadastro(new Date());

			boolean contem = false;
			for (ImagemAnimal img : getModel().getImagens()) {
				if (img.getNomeImagem().trim().equalsIgnoreCase(name)) {
					contem = true;
				}
			}
			if (!contem) {
				imagensToList.add(imagem);
				getModel().getImagens().add(imagem);
				universalManager.save(imagem);
			}
			FacesMessagesUtil.addInfoMessage(this.getQualifiedName(), this.getSaveMessage() + " " + ConstantesARQ.COM_SUCESSO);
			getModel().getListaUrls();
		} catch (Exception e) {
			FacesMessagesUtil.addErrorMessage(this.getQualifiedName(), ConstantesARQ.ERRO_SALVAR);
			ExcecaoUtil.tratarExcecao(e);
		}
	}

	@Override
	public Animal createModel() {
		return new Animal();
	}

	@Override
	public String getQualifiedName() {
		return "Imagem(s)";
	}

	@Override
	public boolean isFeminino() {
		return false;
	}

	public List<ImagemAnimal> getImagensToList() {
		return imagensToList;
	}

	public void setImagensToList(List<ImagemAnimal> imagensToList) {
		this.imagensToList = imagensToList;
	}

	public static long getSerialversionuid() {
		return serialVersionUID;
	}

	public ImagemAnimal getImagemExcluir() {
		return imagemExcluir;
	}

	public void setImagemExcluir(ImagemAnimal imagemExcluir) {
		this.imagemExcluir = imagemExcluir;
	}

	public AnimalService getAnimalService() {
		return animalService;
	}

	public void setAnimalService(AnimalService animalService) {
		this.animalService = animalService;
	}

}
